package com.neu.dao.impl;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
import com.neu.dao.IreflectDao;
import com.neu.pojo.Model;
import com.neu.pojo.Problem;
import com.neu.pojo.Reflect;

public class ReflectDao implements IreflectDao {
	//属性
	private File file = new File("reflect.json");//文件
	private ObjectMapper om = new ObjectMapper();//objmapper
	//单例
	private static IreflectDao reflectDao = new ReflectDao();
	private ReflectDao() {}
	public static IreflectDao getInstance() {
		return reflectDao;
	}
	
	//添加
	@Override
	public boolean add(Model m,Problem p) {
		ArrayList<Reflect> reflects = new ArrayList<>();//关系集合
		
		try {
			reflects = om.readValue(file, new TypeReference<List<Reflect>>() {});//反序列化
			reflects.add(new Reflect(m.getId(), p.getId()));//找到
			om.writeValue(file, reflects);//序列化
			return true;//返回
		}catch(MismatchedInputException e) {//文件内无内容
			reflects.add(new Reflect(m.getId(), p.getId()));//找到
			try {
				om.writeValue(file, reflects);//序列化
				return true;//返回
			} catch (IOException e1) {//异常
				e1.printStackTrace();//异常
				return false;//返回
			}
		}catch (IOException e) {//异常
			e.printStackTrace();
			return false;//返回
		}
	}

	@Override
	public ArrayList<Reflect> list(){
		ArrayList<Reflect> reflects = new ArrayList<>();//关系集合
		
		try {
			reflects = om.readValue(file, new TypeReference<List<Reflect>>() {});//反序列化
			return reflects;//返回
		}catch(MismatchedInputException e) {//文件内无内容
			return reflects;//返回
		}catch (IOException e) {//异常
			e.printStackTrace();
			return null;//返回
		}
	}
	
	@Override
	public boolean link(Model m,Problem p) {//关联模板与问题
		ArrayList<Reflect> reflects = new ArrayList<>();//关系集合
		
		try {
			reflects = om.readValue(file, new TypeReference<List<Reflect>>() {});//反序列化
			if(!islink(m, p)) {
				reflects.add(new Reflect(m.getId(), p.getId()));//找到
				om.writeValue(file, reflects);//序列化
				return true;//返回
			}else {//已经连接上了，返回true，但不重复添加
				return true;//返回
			}
		}catch(MismatchedInputException e) {//文件内无内容
			reflects.add(new Reflect(m.getId(), p.getId()));//找到
			try {
				om.writeValue(file, reflects);//序列化
			} catch (IOException e1) {//异常
				e1.printStackTrace();//异常
				return false;//返回
			}
			return true;//返回
		}catch (IOException e) {//异常
			e.printStackTrace();//异常
			return false;//返回
		}
	}
	
	@Override
	public boolean delete(Model m,Problem p) {
		ArrayList<Reflect> reflects = new ArrayList<>();//关系集合
		
		try {
			reflects = om.readValue(file, new TypeReference<List<Reflect>>() {});//反序列化
			
			for(int i=0;i<reflects.size();i++) {//遍历
				if(reflects.get(i).getMid() == m.getId()&&reflects.get(i).getPid() == p.getId()) {//找到
					reflects.remove(i);
					om.writeValue(file, reflects);//序列化
					return true;//返回
				}
			}
			return false;//返回
		}catch(MismatchedInputException e) {//文件内无内容
			return false;//返回
		}catch (IOException e) {//异常
			e.printStackTrace();
			return false;//返回
		}
	}
	
	@Override
	public boolean islink(Model m,Problem p) {//判断是否有连线
		ArrayList<Reflect> reflects = new ArrayList<>();//关系集合
		
		try {
			reflects = om.readValue(file, new TypeReference<List<Reflect>>() {});//反序列化
			for(Reflect r:reflects) {//遍历
				if(r.getMid() == m.getId()&&r.getPid() == p.getId()) {//找到
					return true;//返回
				}
			}
			return false;//返回
		}catch(MismatchedInputException e) {//文件内无内容
			return false;//返回
		}catch (IOException e) {//异常
			e.printStackTrace();
			return false;//返回
		}
	}
	
	@Override
	public boolean delete(Problem p) {//删关系
		ArrayList<Reflect> reflects = new ArrayList<>();//关系集合
		
		try {
			reflects = om.readValue(file, new TypeReference<List<Reflect>>() {});//反序列化
			for(int i=reflects.size()-1;i>=0;i--) {//遍历
				if(reflects.get(i).getPid() == p.getId()) {//找到
					reflects.remove(i);
				}
			}
			om.writeValue(file, reflects);
			return true;//返回
		}catch(MismatchedInputException e) {//文件内无内容
			return true;//返回
		}catch (IOException e) {//异常
			e.printStackTrace();
			return false;//返回
		}	
	}
	
	@Override
	public boolean delete(Model m) {//跟m连线全部删除
		ArrayList<Reflect> reflects = new ArrayList<>();//关系集合
		
		try {
			reflects = om.readValue(file, new TypeReference<List<Reflect>>() {});//反序列化
			for(int i=reflects.size()-1;i>=0;i--) {//遍历
				if(reflects.get(i).getMid() == m.getId()) {//找到
					reflects.remove(i);
				}
			}
			om.writeValue(file, reflects);//序列化
			return true;//返回
		}catch(MismatchedInputException e) {//文件内无内容
			return true;//返回
		}catch (IOException e) {//异常
			e.printStackTrace();
			return false;//返回
		}			
	}
	
	//测试，加数据
//	public static void main(String[] args) {
//		System.out.println(ReflectDao.getInstance().add(new Model(1), new Problem(1)));
//		
//	}
}
